from PIL import Image, ImageDraw, ImageFont
import os


def png_to_gif(png_folder, gif_output_path, duration=200, loop=0):
    """
    将指定文件夹中的PNG图片转换为GIF动画。

    :param png_folder: 包含PNG图片的文件夹路径
    :param gif_output_path: 输出的GIF文件路径
    :param duration: 每帧显示的时间（毫秒）
    :param loop: GIF循环次数，0表示无限循环
    """
    # 获取PNG图片列表，并按文件名排序
    png_files = [f for f in os.listdir(png_folder) if f.lower().endswith('.png')]
    png_files.sort()  # 根据需要调整排序方式

    if not png_files:
        print("指定的文件夹中没有找到PNG图片。")
        return

    # 打开所有PNG图片并存储在列表中
    images = []
    for file in png_files:
        file_path = os.path.join(png_folder, file)
        try:
            img = Image.open(file_path)
            img = img.convert("RGBA")  # 转换为RGBA模式以支持透明度
            images.append(img)
        except IOError as e:
            print(f"无法打开图片 {file_path}: {e}")

    if not images:
        print("没有可用的图片来创建GIF。")
        return

    # 打印调试信息
    print(f"成功加载了 {len(images)} 张图片。")

    # 保存为GIF
    try:
        images[0].save(
            gif_output_path,
            save_all=True,
            append_images=images[1:],
            duration=duration,
            loop=loop,
            optimize=True
        )
        print(f"GIF已成功保存到 {gif_output_path}")
    except Exception as e:
        print(f"保存GIF时出错: {e}")


def replace_text_in_image(image_path, new_text, output_path, font_path, font_size=100, fill=(0, 0, 0)):
    """
    在图片上绘制新的文字，并调整字体大小。

    :param image_path: 输入的图片路径
    :param new_text: 要绘制的文字
    :param output_path: 输出的图片路径
    :param font_path: 字体文件，.ttf文件
    :param font_size: 字体大小，默认为100
    :param fill: 字体颜色，默认为黑色 (R, G, B)
    """
    # 加载图片
    image = Image.open(image_path)

    # 创建一个Draw对象
    draw = ImageDraw.Draw(image)

    # 检查字体文件是否存在
    if not os.path.exists(font_path):
        raise FileNotFoundError(f"字体文件未找到: {font_path}")

    # 加载字体，调整字体大小
    try:
        font = ImageFont.truetype(font_path, size=font_size)
    except OSError:
        raise OSError(f"无法打开字体文件: {font_path}")

    # 使用 textbbox 获取文本尺寸
    bbox = draw.textbbox((0, 0), new_text, font=font)
    text_width = bbox[2] - bbox[0]
    text_height = bbox[3] - bbox[1]

    # 计算文本位置（居中）
    x = (image.width - text_width) / 2
    y = (image.height - text_height) / 2.8

    # 绘制新文字，设置字体颜色
    draw.text((x, y), new_text, font=font, fill=fill)

    # 保存修改后的图片
    image.save(output_path)
    print(f"新图片已保存到 {output_path}")


# 示例用法
if __name__ == "__main__":
    base_dir1 = "picture1/"  # 最初图片文件夹
    base_dir2 = "picture2/"  # 写完名字后图片存储的文件夹
    result_path = "result/output.gif"  # 输出的GIF文件路径
    font_path = "Font/STXINGKA.ttf"

    name_text = "张三"  # 动图中的人名

    font_size = 250  # 人名的字体大小
    colors = [(0, 0, 255), (228, 36, 214)]  # 字体的颜色，蓝/粉交替颜色
    #  动图的设置
    duration0= 150  # 每帧持续时间（毫秒）
    loop0= 0  # 循环次数，0表示无限循环
    # 将名字写入PNG
    for i in range(5):  # 处理 0000-0004 共5个文件
        # 生成四位数序号（例如 0000）
        frame_num = f"{i:04d}"
        # 构建输入输出路径
        image_path = f"{base_dir1}frame_{frame_num}.png"
        output_path = f"{base_dir2}frame_{frame_num}.png"
        # 自动交替颜色（偶数索引用蓝色，奇数用粉色）
        fill_color = colors[i % 2]
        # 调用处理函数
        replace_text_in_image(
            image_path=image_path,
            new_text=name_text,
            output_path=output_path,
            font_path=font_path,
            font_size=font_size,
            fill=fill_color
        )
    png_to_gif(base_dir2, result_path,duration0,loop0)